package net.sh.dpinfrastructure.support.spring.configuration;

import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.ApplicationContext;

import net.sh.dpinfrastructure.config.DPFileConfig;

/**
 * 
 * 启用基础设施
 * 
 * @author shaohui 
 * @date: 2016年7月30日下午2:34:04 <br/> 
 * @version  
 * @since JDK 1.8
 */
public final class DPInfrastructureStarter {
    
    private DPInfrastructureStarter() {};
    
    /**
     * 
     * 启动应用
     *
     * @return
     * 
     * @author shaohui
     * @date 2016年8月8日 下午5:20:16
     */
    public static ApplicationContext start(Class<?> businessConfiguration, String[] args) {
        String configFilePath = System.getProperty("config.path");
        if (StringUtils.isEmpty(configFilePath)) {
            throw new IllegalArgumentException("empty config");
        }
        DPFileConfig config = new DPFileConfig(configFilePath);
        SpringApplicationBuilder builder = new SpringApplicationBuilder();
        // 加载默认配置
        if (config.getBoolValue("module.config.enable", true)) { // 启用config模块
            builder.sources(DPConfigConfiguration.class);
        }
        if (config.getBoolValue("module.log.enable", true)) { // 启用log模块
            builder.sources(DPLogConfiguration.class);
        }
        if (config.getBoolValue("module.sql.enable", false)) { // 启用sql模块
            builder.sources(DPJDBCConfiguration.class);
        }
        if (config.getBoolValue("module.mongodb.enable", false)) { // 启用mongodb模块
            builder.sources(DPMongodbConfiguration.class);
        }
        if (config.getBoolValue("module.search.elasticsearch.enable", false)) { // 启用es搜索
            builder.sources(DPElasticSearchConfiguration.class);
        }
        if (config.getBoolValue("module.message.redis.enable", false)) { // 启用基于redis消息队列模块
            builder.sources(DPRedisMessageConfiguration.class);
        }
        if (config.getBoolValue("module.cache.redis.enable", false)) { // 启用基于redis缓存模块
            builder.sources(DPRedisCacheConfiguration.class);
        }
        if (config.getBoolValue("module.mail.jdk.enable", false)) { // 启用基于java mail的邮件模块
            builder.sources(DPJavaMailConfiguration.class);
        }
        if (config.getBoolValue("module.mail.spring.enable", false)) { // 启用基于spring mail的邮件模块
            builder.sources(DPSpringMailConfiguration.class);
        }
        if (config.getBoolValue("module.http.httpclent.enable", false)) { // 启用基于http client的http模块
            builder.sources(DPHttpClientConfiguration.class);
        }
        if (config.getBoolValue("module.http.okhttp.enable", false)) { // 启用基于http client的http模块
            builder.sources(DPOKHttpConfiguration.class);
        }
        if (config.getBoolValue("module.sms.enable", false)) { // 启用短信模块
            builder.sources(DPSMSConfiguration.class);
        }
        if (businessConfiguration != null) {
            builder.child(businessConfiguration);
        }
        return builder.registerShutdownHook(true).run(args);
    }
}
